﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CapaPresentacion.Commands;
using CapaPresentacion.Vistas;
using Entidades;
using CapaLogica;
using System.Windows.Input;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Transactions;
using CapaPresentacion.Controles;

namespace CapaPresentacion.Vistas
{
    class VentanaCargaActividadesDidacticasViewModel
    {

        public event CargarActividadDidactica CargarActividadDidactica;

        VentanaCargaActividadesDidacticas view;

        public List<ViewEntity> ListaActividades { get; set; }
        public TrackableCollection<ViewEntity> ListaActividadesDia { get; set; }

        private Guid idActividadSeleccionada;
        private PlanificacionProyectoDidactico planificacion;

        private Guid idPlanificacionDidactica;
        private int diaPlanificacion;
        private Button boton;

        private RelayCommand agregarCommand;
        private RelayCommand quitarCommand;
        private RelayCommand quitarTodasCommand;
        private RelayCommand aceptarCommand;
        private RelayCommand cancelarCommand;


        public ICommand AgregarCommand
        {
            get
            {
                return agregarCommand;
            }
        }

        public ICommand QuitarCommand
        {
            get
            {
                return quitarCommand;
            }
        }

        public ICommand QuitarTodasCommand
        {
            get
            {
                return quitarTodasCommand;
            }
        }


        public ICommand AceptarCommand
        {
            get
            {
                return aceptarCommand;
            }
        }

        public ICommand CancelarCommand
        {
            get
            {
                return cancelarCommand;
            }
        }

        public Guid IdActividadSeleccionada
        {
            get { return idActividadSeleccionada; }
            set { idActividadSeleccionada = value; }

        }

      
        public  VentanaCargaActividadesDidacticasViewModel() { }


        public VentanaCargaActividadesDidacticasViewModel(VentanaCargaActividadesDidacticas vista, List<PlanificacionDiariaProyectoDidactico> Actividades, Button btn, int dia, PlanificacionProyectoDidactico planificacionActual) 
        {

            ListaActividades = new ActividadDidacticaLogica().ObtenerEntidades();

            ListaActividadesDia = new TrackableCollection<ViewEntity>();

            if (Actividades.Count > 0)
            {
                foreach (var item in Actividades)
                {
                    ViewEntity entidad;

                    if (item.ActividadDidactica.DuracionActividad == 1)
                    {
                        entidad = new ViewEntity(item.ActividadDidactica.IdActividad, item.ActividadDidactica.NombreActividad + " (" + item.ActividadDidactica.DuracionActividad + " minuto)");
                    }
                    else
                    {
                        entidad = new ViewEntity(item.ActividadDidactica.IdActividad, item.ActividadDidactica.NombreActividad + " (" + item.ActividadDidactica.DuracionActividad + " minutos)");

                    }
                    
                    
                    ListaActividadesDia.Add(entidad);
                }
                               
            }

            this.view = vista;
            this.boton = btn;
            this.diaPlanificacion = dia;
            this.planificacion = planificacionActual;
            this.idPlanificacionDidactica = planificacionActual.IdPlanificacionProyectoDidactico;
            this.agregarCommand = new RelayCommand(AgregarActividad);
            this.quitarCommand = new RelayCommand(QuitarActividad);
            this.quitarTodasCommand = new RelayCommand(QuitarTodas);
            this.aceptarCommand = new RelayCommand(Aceptar);
            this.cancelarCommand = new RelayCommand(Cancelar);

            if (Actividades.Count > 0)
                this.view.btnQuitarTodas.Visibility = Visibility.Visible;

        
        }






        private void AgregarActividad(Object parameter)
        {
            this.view.lblNoActivity.Visibility = Visibility.Collapsed;
            this.view.lblNoselectedActivity.Visibility = Visibility.Collapsed;
            this.view.lblSameActivity.Visibility = Visibility.Collapsed;

            if (idActividadSeleccionada != Guid.Empty)
            {

                if (ListaActividadesDia.Count > 0)
                {
                    ViewEntity ultima = ListaActividadesDia[ListaActividadesDia.Count - 1];

                    if (ultima.Id != idActividadSeleccionada)
                    {
                        ActividadDidactica item = new ActividadDidacticaLogica().ObtenerEntidad(idActividadSeleccionada);
                        ViewEntity entidad;

                        if (item.DuracionActividad == 1)
                        {
                            entidad = new ViewEntity(item.IdActividad, item.NombreActividad + " (" + item.DuracionActividad + " minuto)");
                        }
                        else
                        {
                            entidad = new ViewEntity(item.IdActividad, item.NombreActividad + " (" + item.DuracionActividad + " minutos)");

                        }

                        ListaActividadesDia.Add(entidad);
                        this.view.btnQuitarTodas.Visibility = Visibility.Visible;
                    }
                    else
                    {
                        this.view.lblSameActivity.Visibility = Visibility.Visible;

                    }

                }
                else
                {
                    ActividadDidactica item = new ActividadDidacticaLogica().ObtenerEntidad(idActividadSeleccionada);
                    ViewEntity entidad;

                    if (item.DuracionActividad == 1)
                    {
                        entidad = new ViewEntity(item.IdActividad, item.NombreActividad + " (" + item.DuracionActividad + " minuto)");
                    }
                    else
                    {
                        entidad = new ViewEntity(item.IdActividad, item.NombreActividad + " (" + item.DuracionActividad + " minutos)");

                    }

                    ListaActividadesDia.Add(entidad);
                    this.view.btnQuitarTodas.Visibility = Visibility.Visible;

                }

            }
            else
            {

                this.view.lblNoActivity.Visibility = Visibility.Visible;
                this.view.lblNoselectedActivity.Visibility = Visibility.Collapsed;

            }

        }

        private void QuitarActividad(Object parameter)
        {
            this.view.lblNoActivity.Visibility = Visibility.Collapsed;
            this.view.lblNoselectedActivity.Visibility = Visibility.Collapsed;
            this.view.lblSameActivity.Visibility = Visibility.Collapsed;

            if (this.view.listaDatos.SelectedIndex != -1)
            {

                if(this.view.listaDatos.SelectedIndex != 0 && this.view.listaDatos.SelectedIndex != ListaActividadesDia.Count - 1)
                {
                    ViewEntity anterior = ListaActividadesDia[this.view.listaDatos.SelectedIndex - 1];
                    ViewEntity posterior = ListaActividadesDia[this.view.listaDatos.SelectedIndex + 1];

                    if (anterior.Id != posterior.Id)
                    {
                        ListaActividadesDia.RemoveAt(this.view.listaDatos.SelectedIndex);

                        if (ListaActividadesDia.Count == 0)
                            this.view.btnQuitarTodas.Visibility = Visibility.Collapsed;


                    }
                    else
                        this.view.lblSameActivity.Visibility = Visibility.Visible;

                }
                else
                {

                    ListaActividadesDia.RemoveAt(this.view.listaDatos.SelectedIndex);

                    if (ListaActividadesDia.Count == 0)
                        this.view.btnQuitarTodas.Visibility = Visibility.Collapsed;                  


                }
            }
            else
            {
                this.view.lblNoActivity.Visibility = Visibility.Collapsed;
                this.view.lblNoselectedActivity.Visibility = Visibility.Visible;
            }
        }



        private void QuitarTodas(Object parameter)
        {
            ListaActividadesDia.Clear();
            this.view.btnQuitarTodas.Visibility = Visibility.Collapsed;

        }



        private void Aceptar(Object parameter)
        {

            if (Validacion())
            {

                List<PlanificacionDiariaProyectoDidactico> ListaActividadesFinal = new List<PlanificacionDiariaProyectoDidactico>();

                foreach (var item in ListaActividadesDia)
                {

                    PlanificacionDiariaProyectoDidactico nueva = new PlanificacionDiariaProyectoDidactico();

                    nueva.IdPlanificacionDiaria = Guid.NewGuid();
                    nueva.Dia = this.diaPlanificacion;
                    nueva.ActividadDidactica = new ActividadDidacticaLogica().ObtenerEntidad(item.Id);
                    nueva.IdActividadDidactica = item.Id;
                    nueva.IdPlanificacionProyectoDidactico = idPlanificacionDidactica;

                    ListaActividadesFinal.Add(nueva);

                }

                this.CargarActividadDidactica(this.diaPlanificacion, boton, ListaActividadesFinal);
                this.view.Close();
            }
            else
            {
                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "La duración total de las actividades no puede superar la duración total de un turno");
                nueva.ShowDialog();
                
            }

        }


        private void Cancelar(Object parameter)
        {


            if (MessageBox.Show("¿Está seguro que desea cancelar la carga de actividades? (Todo lo que haya hecho se perderá)", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {

                this.view.Close();

            }
        }


        internal bool Validacion()
        {

            List<Turno> Turnos = new TurnoLogica().ObtenerEntidadesPorAño(this.planificacion.AñoPlanificacion);
            List<int> Horarios = new List<int>();


            foreach (var item in Turnos)
            {

                DateTime horarioEntrada = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, item.HoraInicio, item.MinutosInicio, 0);
                DateTime horarioSalida = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, item.HoraFin, item.MinutosFin, 0);

                TimeSpan resta = horarioSalida.Subtract(horarioEntrada);

                int totalMinutos = resta.Minutes + resta.Hours * 60;

                Horarios.Add(totalMinutos);
            }

            int menor = Horarios.Min();
            int suma = 0;

            foreach (var item in ListaActividadesDia)
            {

                ActividadDidactica acti = new ActividadDidacticaLogica().ObtenerEntidad(item.Id);
                suma = suma + acti.DuracionActividad;

            }

            if (suma <= menor)
                return true;
            else
                return false;

        }


    }
}
